<?php
/**
 * Класс View-объекта, интегрирующий Smarty в Zend_View
 * 
 * @category Phorm
 * @package View
 * @name /Phorm/View.php
 * @copyright phorm.ru
 * @since 05.05.2012
 * @author vladimir@kachalov.net
 */

class Phorm_View extends Zend_View {
	
	/**
     * Объект Smarty
     * @var Smarty
     */
    protected $_smarty;
    
    /**
     * Базовый урл текущего сайта @see Phorm_Application_Resource_Site
     * @var string
     */
    protected $_siteurl;
 
    /**
     * Конструктор
     *
     * @param string $tmplPath
     * @param array $extraParams
     * @return void
     */
    public function __construct($tmplPath = null, $extraParams = array()) {
    	
    	require_once 'Smarty/Smarty.class.php';
        
    	$this->_smarty = new Smarty;
 
        if (null !== $tmplPath) {
            $this->setScriptPath($tmplPath);
        }
 
        foreach ($extraParams as $key => $value) {
            $this->_smarty->$key = $value;
        }
        
        $this->_smarty->assign('view',$this);
        
    }
 
    /**
     * Возвращение объекта шаблонизатора
     *
     * @return Smarty
     */
    public function getEngine() {
        return $this->_smarty;
    }
 
    /**
     * Установка пути к шаблонам
     *
     * @param string $path Директория, устанавливаемая как путь к шаблонам
     * @return void
     */
    public function setScriptPath($path) {
        if (is_readable($path)) {
            $this->_smarty->template_dir = $path;
            return;
        }
 
        throw new Exception('Invalid path provided');
    }
 
    /**
     * Извлечение текущего пути к шаблонам
     *
     * @return string
     */
    public function getScriptPaths() {
        return array($this->_smarty->template_dir);
    }
 
    /**
     * Метод-"псевдоним" для setScriptPath
     *
     * @param string $path
     * @param string $prefix Не используется
     * @return void
     */
    public function setBasePath($path, $prefix = 'Zend_View') {
        return $this->setScriptPath($path);
    }
 
    /**
     * Метод-"псевдоним" для addScriptPath
     *
     * @param string $path
     * @param string $prefix Не используется
     * @return void
     */
    public function addBasePath($path, $prefix = 'Zend_View') {
        return $this->setScriptPath($path);
    }
 
    /**
     * Присвоение значения переменной шаблона
     *
     * @param string $key Имя переменной
     * @param mixed $val Значение переменной
     * @return void
     */
    public function __set($key, $val) {
        $this->_smarty->assign($key, $val);
    }
 
    /**
     * Получение значения переменной
     *
     * @param string $key Имя переменной
     * @return mixed Значение переменной
     */
    public function __get($key) {
        return $this->_smarty->getVariable($key)->value;
    }
 
    /**
     * Позволяет проверять переменные через empty() и isset()
     *
     * @param string $key
     * @return boolean
     */
    public function __isset($key) {
        return (null !== $this->_smarty->getVariable($key)->value);
    }
 
    /**
     * Позволяет удалять свойства объекта через unset()
     *
     * @param string $key
     * @return void
     */
    public function __unset($key) {
        $this->_smarty->clear_assign($key);
    }
 
    /**
     * Присвоение переменных шаблону
     *
     * Позволяет установить значение к определенному ключу или передать массив
     * пар ключ => значение
     *
     * @see __set()
     * @param string|array $spec Ключ или массив пар ключ => значение
     * @param mixed $value (необязательный) Если присваивается значение одной переменной, то через него передается значение переменной
     * @return void
     * @todo Протестировать производительность и общее кол-во вызовов render() Неясно в чем причина, но если не используются виджеты, JS в элементах форм не рендерится (@fixed ?)
     * @todo В массивы добавить render
     */
    public function assign($spec, $value = null) {
        if (is_array($spec)) {
            $this->_smarty->assign($spec);
            return;
        }
        if(is_object($value) && method_exists($value,'render')) {
        	$this->_smarty->assign($spec, $value->render());
        } else {
        	$this->_smarty->assign($spec, $value);
        }
    }
 
    /**
     * Удаление всех переменных
     *
     * @return void
     */
    public function clearVars() {
        $this->_smarty->clear_all_assign();
    }
 
    /**
     * Обрабатывает шаблон и возвращает вывод
     *
     * @param string $name Шаблон для обработки
     * @return string Вывод
     */
    public function render($name) {
    	
        return $this->_smarty->fetch($name);
    }
    
    
    /**
     * Устанавливает URL текущего сайта
     *
     * @param string $url
     * @return void
     * @todo Перенести в помощники вида как у Зенда?
     */
    
    public function setSiteUrl($url) {
    	
    	$this->_siteurl = $url;
    	
    }
    
    
    /**
     * Возвращает URL текущего сайта
     *
     * @return string
     */
    
    public function getSiteUrl() {
    	
    	return $this->_siteurl;
    	
    }
    
    
    /**
     * Возвращает URL текущего сайта
     *
     * @return string
     */
    
    public function siteUrl() {
    	
    	return $this->getSiteUrl();
    	
    }
	
}